package com.c2b.algorithm.newcoder.binary_search;

/**
 * <a href="https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=295&tqId=23256&ru=%2Fpractice%2Fd3df40bd23594118b57554129cadf47b&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295">二维数组中的查找</a>
 * <p>在一个二维数组array中（每个一维数组的长度相同），每一行都按照从左到右递增的顺序排序，每一列都按照从上到下递增的顺序排序。<br>
 * 请完成一个函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。</p>
 * <pre>
 *      [
 *      [1,2,8,9],
 *      [2,4,9,12],
 *      [4,7,10,13],
 *      [6,8,11,15]
 *      ]
 * 给定 target = 7，返回 true。
 *
 * 给定 target = 3，返回 false。
 * </pre>
 * <p>数据范围：矩阵的长宽满足0≤n,m≤500 ， 矩阵中的值满足0≤val≤10^9<br>
 * 进阶：空间复杂度O(1) ，时间复杂度O(n+m)</p>
 *
 * @author c2b
 * @since 2023/3/13 10:46
 */
public class M_BM0018Find {

    public boolean Find(int target, int [][] array) {
        // 如果数组为null、数组的总行数为0、数组的总列数为0
        if (array == null || array.length == 0 || array[0].length == 0) {
            return false;
        }
        // 当前所在行号
        int rowIndex = 0;
        // 当前所在列号
        int colIndex = array[0].length - 1;
        // 从右上角向下搜索
        while (rowIndex < array.length && colIndex >= 0) {
            if (array[rowIndex][colIndex] > target) {
                colIndex--;
            } else if (array[rowIndex][colIndex] < target) {
                rowIndex++;
            } else {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[][] ints1 = {
                {1,2,8,9},
                {2,4,9,12},
                {4,7,10,13},
                {6,8,11,15}
        };
        int[][] ints2 = {
                {2}
        };
        M_BM0018Find m_bm0018Find = new M_BM0018Find();
        System.out.println(m_bm0018Find.Find(7, ints2));
    }
}
